/**
 * Copyright(c) 2014 Xunton Solutions
 *
 * History:
 *   14-12-23 下午12:36 Created by dwzhang
 */
package com.jade.bss.beacon;

import java.util.List;

import com.jade.bss.beacon.location.Location;
import com.jade.framework.base.criterion.Criteria;
import com.jade.framework.base.util.PagingList;

/**
 * Beacon管理器。
 *
 * @author <a href="mailto:dwzhang@xunton.com">dwzhang</a> 
 * @version 1.0 14-12-23 下午12:36
 */
public interface BeaconManager
{
    /**
     * 产生Beacon的UUID及ID。
     *
     * @return UUID.
     */
    public String generateUUID();

    /**
     * 创建beacon。
     *
     * @throws BeaconException 处理异常
     * @param beacon beacon信息。
     */
    public Beacon createBeacon(Beacon beacon)
            throws BeaconException;

    /**
     * 更新beacon信息。
     *
     * @param beacon beacon信息。
     * @throws BeaconException 处理异常
     */
    public void updateBeacon(Beacon beacon)
            throws BeaconException;

    public void updateBeacon(List<Beacon> beacons)
            throws BeaconException;

    public void updateApp(String appType, long appId, long... ids)
            throws BeaconException;

    /**
     * 移动端报告beacon信息。
     *
     * @param beacon beacon信息。
     * @throws BeaconException 处理异常
     */
    public void reportBeacon(Beacon beacon)
            throws BeaconException;

    /**
     * 更新beacon信息。
     *
     * @param id beacon标识
     * @param status beacon状态信息。
     * @throws BeaconException 处理异常
     */
    public void updateStatus(long id, int status)
            throws BeaconException;

    /**
     * 根据标识获取beacon信息。
     *
     * @param id beacon标识
     * @return beacon信息对象。
     */
    public Beacon getBeacon(long id);

    /**
     * 根据UUID,major, minor来获取beacon信息。
     *
     * @param uuid beacon UUID
     * @param major beacon major
     * @param minor beacon minor
     * @return beacon信息对象。
     */
    public Beacon getBeaconByUUID(String uuid, int major, int minor);

    /**
     * 删除beacon信息。
     *
     * @param ids beacon标识
     */
    public void removeBeacon(long... ids)
            throws BeaconException;

    /**
     * 列出一个所有者的beacon。
     *
     * @param ownerType 所有者类型
     * @param ownerId 所有者标识
     * @param status -1 所有 0 - 未激活   5 激活    9 已撤销
     * @return beacon列表
     */
    public List<Beacon> listBeacon(String ownerType, String ownerId, int status);

    public List<Beacon> listBeacon(Criteria criteria);

    /**
     * 根据条件查询beacon。
     *
     * @param criteria 查询条件
     * @return 满足条件的beacon列表。
     */
    public PagingList<Beacon> queryBeacon(Criteria criteria);

    /**
     * 处理beacon事件。
     *
     * @param event beacon事件
     * @return 时间处理结果。
     * @throws BeaconException 处理异常
     */
    public Location handleEvent(BeaconEvent event)
            throws BeaconException;


    PagingList<Beacon> queryBeacon(Criteria criteria, Class... infos);

    <Info extends BeaconExtInfo> Info getInfo(long beaconId, Class infoClass);

    /**
     * 根据条件获取beacon数量
     * @param criteria
     * @return
     */
    public long getBeaconCount(Criteria criteria);

    public void removeInfo(BeaconExtInfo info)
            throws BeaconException;

    Beacon getBeacon(String uuid, int major, int minor);
}
